home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / 800ks.zip / 800KFMAT.ASM < prev    next >
Assembly Source File  |  1987-11-02  |  9KB  |  624 lines

  1. CODE    SEGMENT
  2.     ASSUME    CS:CODE,DS:CODE
  3.     ORG    100H
  4.  
  5. START:    JMP    GO
  6.  
  7. ;-------------------------------------------
  8.  
  9.     EVEN
  10.     DW    128 DUP (0)
  11. STKTOP    DW    0
  12.  
  13. CYLPERDSK EQU    80
  14.  
  15. BYTESPERSEC EQU    512
  16. SECPERCLUS EQU    2
  17. RESERVEDSEC EQU    1
  18. NMBROFFATS EQU    2
  19. ROOTENTRIES EQU    112
  20. SECPERDISK EQU    1600
  21. DESCRIPTOR EQU    0F0H
  22. SECPERFAT EQU    3
  23. SECPERTRK EQU    10
  24. NMBROFHEADS EQU    2
  25. HIDDENSEC EQU    0
  26.  
  27. DSM    EQU    57H
  28.  
  29. OLD_DISKBASE DD    0
  30.  
  31. OLD23    DD    0
  32.  
  33. CYL    DB    0
  34. HEAD    DB    0
  35. SECT    DB    0
  36.  
  37. RETRY_COUNT DW    0
  38.  
  39. DRIVE    DB    0
  40. BREAK    DB    0
  41.  
  42. DISKBASE DB    0DFH
  43.     DB    02H
  44.     DB    25H
  45.     DB    02H
  46.     DB    SECPERTRK
  47.     DB    1BH
  48.     DB    0FFH
  49.     DB    28H  ;format gap
  50.     DB    00H  ;fill byte
  51.     DB    0FH
  52.     DB    08H
  53.  
  54. ;        C H R N
  55. SA    DB    0,0,1,2
  56.     DB    0,0,2,2
  57.     DB    0,0,3,2
  58.     DB    0,0,4,2
  59.     DB    0,0,5,2
  60.     DB    0,0,6,2
  61.     DB    0,0,7,2
  62.     DB    0,0,8,2
  63.     DB    0,0,9,2
  64.     DB    0,0,10,2
  65.  
  66. MSG1    DB    0DH,0AH,'Format successful.',0DH,0AH,24H
  67. MSG2    DB    0DH,0AH,'Format failed - track 0 unusable.',0DH,0AH,24H
  68. MSG3    DB    0DH,'Cylinder '
  69. MSG3A    DB    '  ','    '
  70.     DB    'Head '
  71. MSG3B    DB    '  ',24H
  72. MSG4    DB    '   -   error on this track.',0Dh,0Ah,24h
  73. MSG5    DB    0DH,0AH,'Format failed - error reading boot sector'
  74.     DB    ' from default drive.',0Dh,0Ah,24h
  75. MSG6    DB    'Drive letter (A: or B:) must be specified.',0Dh,0Ah,24h
  76. MSG7    DB    'Insert diskette and press a key when ready '
  77.     DB    '(or <ESC> to abort).',0Dh,0Ah,24h
  78. MSG8    DB    0DH,0AH,'Terminated by control-break.',0DH,0AH,24H
  79. LOGO    DB    '800 k byte formatter for low-density diskettes'
  80.     DB    ' in PC/AT high-density drive',0Dh,0Ah
  81.     DB    'Version 1.0  -  Copyright (C) 1987, Alan D. Jones',0Dh,0Ah,0Ah
  82.     DB    'Use memory-resident program "800K" to write & read '
  83.     DB    'these diskettes.',0Dh,0Ah,0Ah,24h
  84. CRLF    DB    0DH,0AH,24H
  85.  
  86.     EVEN
  87. BOOTIMG    DB    512 DUP (0)
  88. FAT    DB    DESCRIPTOR,0FFH,0FFH
  89.     DB    509 DUP (0)
  90.     DB    512 DUP (0)
  91.     DB    512 DUP (0)
  92.  
  93. ;-------------------------------------------
  94.  
  95. ;ctrl-break routine
  96.  
  97. INT23    PROC    FAR
  98.  
  99.     MOV    CS:BREAK,1
  100.     IRET
  101.  
  102. INT23    ENDP
  103.  
  104. ;-------------------------------------------
  105.  
  106. ;routine to assure proper setting of
  107. ; "diskette state machine" byte
  108.  
  109. DSMS    PROC
  110.  
  111.     PUSH    ES
  112.     PUSH    BX
  113.     PUSH    AX
  114.     MOV    AX,40H
  115.     MOV    ES,AX
  116.     MOV    BX,90H
  117.     ADD    BL,DRIVE
  118.     MOV    AL,ES:[BX]
  119.     AND    AL,0DFH
  120.     OR    AL,07H
  121.     MOV    ES:[BX],AL
  122.     POP    AX
  123.     POP    BX
  124.     POP    ES
  125.     RET
  126.  
  127. DSMS    ENDP
  128.  
  129. ;-------------------------------------------
  130.  
  131. ;convert byte in AL to ASCII at DS:[DI]
  132.  
  133. BTA    PROC
  134.  
  135.     PUSH    AX
  136.     SUB    AH,AH
  137.     AAM
  138.     ADD    AX,3030H
  139.     MOV    [DI],AH
  140.     MOV    [DI+1],AL
  141.     POP    AX
  142.     RET
  143.  
  144. BTA    ENDP
  145.  
  146. ;-------------------------------------------
  147.  
  148. ;write and verify a sector with retries
  149.  
  150. WRITSEC    PROC
  151.  
  152.     PUSH    BX
  153.     MOV    RETRY_COUNT,5
  154. WRSEC1:
  155.     MOV    DL,DRIVE
  156.     MOV    DH,HEAD
  157.     MOV    CL,SECT
  158.     MOV    CH,CYL
  159.     POP    BX
  160.     PUSH    BX
  161.     MOV    AL,1
  162.     MOV    AH,3
  163.     CLD
  164.     CALL    DSMS
  165.     INT    13H
  166.     JNC    WRSEC3
  167. WRSEC2:
  168.     DEC    RETRY_COUNT
  169.     CMP    RETRY_COUNT,0
  170.     JNE    WRSEC1
  171.  
  172.     POP    BX
  173.     STC
  174.     RET
  175.  
  176. ;verify sector
  177.  
  178. WRSEC3:
  179.     MOV    DL,DRIVE
  180.     MOV    DH,HEAD
  181.     MOV    CL,SECT
  182.     MOV    CH,CYL
  183.     POP    BX
  184.     PUSH    BX
  185.     MOV    AL,1
  186.     MOV    AH,4
  187.     CLD
  188.     CALL    DSMS
  189.     INT    13H
  190.     JC    WRSEC2
  191.  
  192.     POP    BX
  193.     CLC
  194.     RET
  195.  
  196. WRITSEC    ENDP
  197.  
  198. ;-------------------------------------------
  199.  
  200. GO:
  201.     PUSH    DS
  202.     CLI
  203.     POP    SS
  204.     MOV    SP,OFFSET STKTOP
  205.     STI
  206.  
  207. ;display logo
  208.  
  209.     MOV    DX,OFFSET LOGO
  210.     MOV    AH,9
  211.     INT    21H
  212.  
  213. ;scan command line for drive letter
  214.  
  215.     MOV    SI,80H
  216.     SUB    CH,CH
  217.     MOV    CL,[SI]
  218.     INC    SI
  219.     INC    SI
  220.     CMP    CX,3
  221.     JB    CLERR
  222.     SUB    CX,2
  223. CLSCL:
  224.     CMP    WORD PTR [SI],3A41H
  225.     JE    DRV0
  226.     CMP    WORD PTR [SI],3A61H
  227.     JE    DRV0
  228.     CMP    WORD PTR [SI],3A42H
  229.     JE    DRV1
  230.     CMP    WORD PTR [SI],3A62H
  231.     JE    DRV1
  232.     LOOP    CLSCL
  233.  
  234. ;command line error
  235.  
  236. CLERR:
  237.     MOV    DX,OFFSET MSG6
  238.     MOV    AH,9
  239.     INT    21H
  240.     MOV    AX,4C00H
  241.     INT    21H
  242.  
  243. ;drive 0 (A:)
  244.  
  245. DRV0:
  246.     MOV    DRIVE,0
  247.     JMP    RDBOOTIMG
  248.  
  249. ;drive 1 (B:)
  250.  
  251. DRV1:
  252.     MOV    DRIVE,1
  253.  
  254. ;read boot sector from current drive
  255.  
  256. RDBOOTIMG:
  257.     MOV    AH,19H
  258.     INT    21H
  259.     MOV    BX,OFFSET BOOTIMG
  260.     MOV    CX,1
  261.     MOV    DX,0
  262.     INT    25H
  263.     ADD    SP,2
  264.     JNC    DRIVINIT
  265.  
  266.     MOV    DX,OFFSET MSG5
  267.     MOV    AH,9
  268.     INT    21H
  269.     MOV    AX,4C01H
  270.     INT    21H
  271.  
  272. ;initialize the floppy drive (clear change line)
  273.  
  274. DRIVINIT:
  275.     MOV    DX,OFFSET MSG7
  276.     MOV    AH,9
  277.     INT    21H
  278.     MOV    AH,0
  279.     INT    16H
  280.     CMP    AL,1BH
  281.     JNE    DRVINIT1
  282.     MOV    AX,4C00H
  283.     INT    21H
  284.  
  285. DRVINIT1:
  286.     MOV    AH,0
  287.     MOV    DL,DRIVE
  288.     INT    13H
  289.  
  290.     MOV    DL,DRIVE
  291.     MOV    DH,0
  292.     MOV    CH,1
  293.     MOV    CL,1
  294.     MOV    BX,OFFSET THEEND
  295.     CLD
  296.     MOV    AX,0201H
  297.     INT    13H
  298.  
  299.     MOV    DL,DRIVE
  300.     MOV    DH,0
  301.     MOV    CH,0
  302.     MOV    CL,1
  303.     MOV    BX,OFFSET THEEND
  304.     CLD
  305.     MOV    AX,0201H
  306.     INT    13H
  307.  
  308. ;grab ctrl-break interrupt
  309.  
  310.     MOV    AX,3523H
  311.     INT    21H
  312.     MOV    WORD PTR OLD23,BX
  313.     MOV    WORD PTR OLD23+2,ES
  314.     MOV    DX,OFFSET INT23
  315.     MOV    AX,2523H
  316.     INT    21H
  317.  
  318. ;set up new disk_base
  319.  
  320.     SUB    AX,AX
  321.     MOV    ES,AX
  322.     MOV    BX,78H
  323.     LES    BX,ES:[BX]
  324.     MOV    WORD PTR OLD_DISKBASE,BX
  325.     MOV    WORD PTR OLD_DISKBASE+2,ES
  326.     SUB    AX,AX
  327.     MOV    ES,AX
  328.     MOV    BX,78H
  329.     MOV    ES:[BX+2],DS
  330.     MOV    ES:[BX],OFFSET DISKBASE
  331.  
  332.     MOV    AX,40H
  333.     MOV    ES,AX
  334.     MOV    BX,90H
  335.     MOV    BYTE PTR ES:[BX],DSM
  336.     MOV    BX,8BH
  337.     MOV    BYTE PTR ES:[BX],DSM
  338.     MOV    BX,41H
  339.     MOV    BYTE PTR ES:[BX],00H
  340.  
  341.     MOV    DX,03F7H
  342.     MOV    AL,DSM
  343.     ROL    AL,1
  344.     ROL    AL,1
  345.     AND    AL,03H
  346.     OUT    DX,AL
  347.  
  348.     MOV    CYL,0
  349.     MOV    HEAD,0
  350.  
  351. ;set up sector addresses
  352.  
  353. FMLOOP:
  354.     MOV    SI,OFFSET SA
  355.     MOV    CX,SECPERTRK
  356. SASET:    MOV    AL,CYL
  357.     MOV    BYTE PTR [SI],AL
  358.     MOV    AL,HEAD
  359.     MOV    BYTE PTR [SI+1],AL
  360.     ADD    SI,4
  361.     LOOP    SASET
  362.  
  363. ;display status message
  364.  
  365.     MOV    AL,CYL
  366.     MOV    DI,OFFSET MSG3A
  367.     CALL    BTA
  368.     MOV    AL,HEAD
  369.     MOV    DI,OFFSET MSG3B
  370.     CALL    BTA
  371.     MOV    DX,OFFSET MSG3
  372.     MOV    AH,9
  373.     INT    21H
  374.  
  375. ;format a track
  376.  
  377.     MOV    RETRY_COUNT,5
  378. BIOSCL1:
  379.     MOV    DL,DRIVE
  380.     MOV    DH,HEAD
  381.     MOV    CL,1
  382.     MOV    CH,CYL
  383.     MOV    BX,OFFSET SA
  384.     PUSH    DS
  385.     POP    ES
  386.     MOV    AL,SECPERTRK
  387.     MOV    AH,5
  388.     CLD
  389.     CALL    DSMS
  390.     INT    13H
  391.     JNC    VFYTRK
  392. DEC_RETRY:
  393.     MOV    DL,DRIVE
  394.     MOV    AH,0
  395.     CALL    DSMS
  396.     INT    13H
  397.     DEC    RETRY_COUNT
  398.     CMP    RETRY_COUNT,0
  399.     JNE    BIOSCL1
  400.     JMP    FMTERR
  401.  
  402. ;verify the track
  403.  
  404. VFYTRK:
  405.     MOV    DL,DRIVE
  406.     MOV    DH,HEAD
  407.     MOV    CL,1
  408.     MOV    CH,CYL
  409.     MOV    BX,OFFSET THEEND
  410.     MOV    AL,SECPERTRK
  411.     MOV    AH,2
  412.     CLD
  413.     CALL    DSMS
  414.     INT    13H
  415.     JC    DEC_RETRY
  416.     JMP    INCTRK
  417.  
  418. ;bad track - flag clusters in FAT image
  419.  
  420. FMTERR:
  421.  
  422. ;display message
  423.  
  424.     MOV    DX,OFFSET MSG4
  425.     MOV    AH,9
  426.     INT    21H
  427.  
  428. ;read sectors one at a time to find bad ones
  429.  
  430.     MOV    SECT,1
  431. READSINGLE:
  432.     MOV    DL,DRIVE
  433.     MOV    DH,HEAD
  434.     MOV    CL,SECT
  435.     MOV    CH,CYL
  436.     MOV    BX,OFFSET THEEND
  437.     MOV    AL,1
  438.     MOV    AH,2
  439.     CLD
  440.     CALL    DSMS
  441.     INT    13H
  442.     JNC    NSSECT
  443.  
  444. ;compute sector number
  445.  
  446.     MOV    AL,CYL
  447.     MOV    CL,SECPERTRK*2
  448.     MUL    CL
  449.     MOV    CL,SECT
  450.     DEC    CL
  451.     SUB    CH,CH
  452.     ADD    AX,CX
  453.     CMP    HEAD,0
  454.     JE    CCN
  455.     ADD    AX,SECPERTRK
  456.  
  457. ;compute cluster number
  458.  
  459. CCN:
  460.     SUB    AX,RESERVEDSEC
  461.     SUB    AX,NMBROFFATS*SECPERFAT
  462.     SUB    AX,(ROOTENTRIES*32)/BYTESPERSEC
  463.     SUB    DX,DX
  464.     MOV    CX,SECPERCLUS
  465.     DIV    CX
  466.     ADD    AX,2
  467.  
  468. ;compute offset into table
  469.  
  470.     MOV    CL,1
  471.     AND    CL,AL
  472.     SHL    CL,1
  473.     SHL    CL,1
  474.     MOV    DX,AX
  475.     SHR    AX,1
  476.     ADD    AX,DX
  477.  
  478. ;write FF7's
  479.  
  480.     MOV    BX,OFFSET FAT
  481.     ADD    BX,AX
  482.     MOV    AX,0FF7H
  483.     SHL    AX,CL
  484.     OR    [BX],AX
  485.  
  486. ;next sector on track
  487.  
  488. NSSECT:
  489.     INC    SECT
  490.     CMP    SECT,SECPERTRK
  491.     JBE    READSINGLE
  492.  
  493. ;increment to next track
  494.  
  495. INCTRK:
  496.     CMP    BREAK,1
  497.     JNE    INCHEAD
  498.     JMP    BREAKEXIT
  499. INCHEAD:
  500.     INC    HEAD
  501.     CMP    HEAD,1
  502.     JA    INCTRK2
  503.     JMP    FMLOOP
  504. INCTRK2:
  505.     MOV    HEAD,0
  506.     INC    CYL
  507.     CMP    CYL,CYLPERDSK
  508.     JNB    SENDLF
  509.     JMP    FMLOOP
  510.  
  511. ;display CRLF
  512.  
  513. SENDLF:
  514.     MOV    DX,OFFSET CRLF
  515.     MOV    AH,9
  516.     INT    21H
  517.  
  518. ;plug in correct media parameters
  519.  
  520.     MOV    BX,OFFSET BOOTIMG
  521.     MOV    WORD PTR [BX+11],BYTESPERSEC
  522.     MOV    BYTE PTR [BX+13],SECPERCLUS
  523.     MOV    WORD PTR [BX+14],RESERVEDSEC
  524.     MOV    BYTE PTR [BX+16],NMBROFFATS
  525.     MOV    WORD PTR [BX+17],ROOTENTRIES
  526.     MOV    WORD PTR [BX+19],SECPERDISK
  527.     MOV    BYTE PTR [BX+21],DESCRIPTOR
  528.     MOV    WORD PTR [BX+22],SECPERFAT
  529.     MOV    WORD PTR [BX+24],SECPERTRK
  530.     MOV    WORD PTR [BX+26],NMBROFHEADS
  531.     MOV    WORD PTR [BX+28],HIDDENSEC
  532.  
  533. ;write diskette boot sector
  534.  
  535.     PUSH    DS
  536.     POP    ES
  537.     MOV    CYL,0
  538.     MOV    HEAD,0
  539.     MOV    SECT,1
  540.     MOV    BX,OFFSET BOOTIMG
  541.     CALL    WRITSEC
  542.     JC    FATALERR
  543.     CMP    BREAK,1
  544.     JE    BREAKEXIT
  545.  
  546. ;write first copy of FAT
  547.  
  548.     MOV    SECT,2
  549.     MOV    BX,OFFSET FAT
  550.     CALL    WRITSEC
  551.     JC    FATALERR
  552.     ADD    BX,512
  553.     MOV    SECT,3
  554.     CALL    WRITSEC
  555.     JC    FATALERR
  556.     ADD    BX,512
  557.     MOV    SECT,4
  558.     CALL    WRITSEC
  559.     JC    FATALERR
  560.     CMP    BREAK,1
  561.     JE    BREAKEXIT
  562.  
  563. ;write second copy of FAT
  564.  
  565.     MOV    SECT,5
  566.     MOV    BX,OFFSET FAT
  567.     CALL    WRITSEC
  568.     JC    FATALERR
  569.     ADD    BX,512
  570.     MOV    SECT,6
  571.     CALL    WRITSEC
  572.     JC    FATALERR
  573.     ADD    BX,512
  574.     MOV    SECT,7
  575.     CALL    WRITSEC
  576.     JC    FATALERR
  577.     CMP    BREAK,1
  578.     JE    BREAKEXIT
  579.  
  580. ;display "ok"